import cn.hutool.core.io.FileUtil;
import com.czg.jsonschema2lombokpojo.SchemaGenerator;
import com.czg.jsonschema2lombokpojo.SchemaMapper;
import com.czg.jsonschema2lombokpojo.SchemaStore;
import com.czg.jsonschema2lombokpojo.SourceType;
import com.czg.jsonschema2lombokpojo.annotator.Jackson2Annotator;
import com.czg.jsonschema2lombokpojo.config.GenerationConfig;
import com.czg.jsonschema2lombokpojo.rules.RuleFactory;
import com.czg.jsonschema2lombokpojo.util.JavaVersion;
import com.sun.codemodel.JCodeModel;

import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.net.URL;


/**
 * @author czg
 */
public class JsonSchema2Entity {
    public static final String OUTPUT_BASE_DIR = System.getProperty("user.dir") + "/entity-output";

    public static void main(String[] args) throws IOException {
        JCodeModel codeModel = new JCodeModel();
        URL source = JsonSchema2Entity.class.getResource("/table-schema.json");
        GenerationConfig config = new GenerationConfig() {

            @Override
            public boolean isIncludeEqualsAndHashCode() {
                return true;
            }

            @Override
            public boolean isIncludeNoArgsConstructor() {
                return true;
            }

            @Override
            public boolean isIncludeAllArgsConstructor() {
                return true;
            }

            @Override
            public boolean isIncludeBuilder() {
                return true;
            }

            @Override
            public boolean isFieldNameConstants() {
                return true;
            }


            @Override
            public boolean isIncludeAccessors() {
                return false;
            }

            @Override
            public boolean getAccessorsFluentValue() {
                return true;
            }

            @Override
            public boolean getAccessorsChainValue() {
                return false;
            }

            @Override
            public String getAccessorsPrefix() {
                return null;
            }

            @Override
            public boolean isEnumIncludeGetter() {
                return true;
            }

            @Override
            public boolean isEnumIncludeAllArgsConstructor() {
                return true;
            }

            /**
             * 获取属性词分隔符
             * @return 一个空数组（即没有单词分隔符）
             */
            @Override
            public char[] getPropertyWordDelimiters() {
                return new char[]{'-', ' ', '_'};
            }

            /**
             * 是否使用长整数
             * @return <code>false</code>
             */
            @Override
            public boolean isUseLongIntegers() {
                return false;
            }

            /**
             * 是否使用双精度数字
             * @return <code>true</code>
             */
            @Override
            public boolean isUseDoubleNumbers() {
                return true;
            }

            /**
             * 是否使用标题作为类名
             * @return {@code false}
             */
            @Override
            public boolean isUseTitleAsClassname() {
                return false;
            }

            /**
             * 是否包含Jsr303注解
             * @return <code>false</code>
             */
            @Override
            public boolean isIncludeValidationAnnotations() {
                return true;
            }

            /**
             * 获得源类型
             * @return {@link SourceType#JSONSCHEMA}
             */
            @Override
            public SourceType getSourceType() {
                return SourceType.JSONSCHEMA;
            }

            /**
             * 是否使用可序列化
             * @return <code>false</code>
             */
            @Override
            public boolean isSerializable() {
                return false;
            }

            /**
             * 是否初始化集合
             * @return <code>true</code>
             */
            @Override
            public boolean isInitializeCollections() {
                return true;
            }

            /**
             * 类名前缀
             * @return
             */
            @Override
            public String getClassNamePrefix() {
                return "";
            }

            /**
             * 类名后缀
             * @return
             */
            @Override
            public String getClassNameSuffix() {
                return "";
            }

            /**
             * 文件扩展名
             * @return
             */
            @Override
            public String[] getFileExtensions() {
                return new String[]{};
            }

            /**
             * 是否使用大整数
             *
             * @return <code>false</code>
             */
            @Override
            public boolean isUseBigIntegers() {
                return false;
            }

            /**
             * 是否使用大的小数
             * @return <code>false</code>
             */
            @Override
            public boolean isUseBigDecimals() {
                return false;
            }

            /**
             * 是否包含附加属性
             * @return <code>true</code>
             */
            @Override
            public boolean isIncludeAdditionalProperties() {
                return true;
            }

            /**
             * Java目标版本
             * @return 当前JVM版本
             */
            @Override
            public String getTargetVersion() {
                return JavaVersion.parse(System.getProperty("java.version"));
            }


            /**
             * 是否格式化日期时间
             * @return <code>false</code>
             */
            @Override
            public boolean isFormatDateTimes() {
                return false;
            }

            /**
             * 是否格式化日期
             * @return <code>false</code>
             */
            @Override
            public boolean isFormatDates() {
                return false;
            }

            /**
             * 引用片段路径分隔符
             * @return "#/."
             */
            @Override
            public String getRefFragmentPathDelimiters() {
                return "#/.";
            }

            /**
             * 自定义日期schema
             * @return
             */
            @Override
            public String getCustomDatePattern() {
                return null;
            }

            /**
             * 自定义时间schema
             * @return
             */
            @Override
            public String getCustomTimePattern() {
                return null;
            }

            /**
             * 自定义日期时间schema
             * @return
             */
            @Override
            public String getCustomDateTimePattern() {
                return null;
            }


            /**
             * 是否使用JakartaValidation
             * @return {@code false}
             */
            @Override
            public boolean isUseJakartaValidation() {
                return true;
            }

            @Override
            public boolean isEnumInSubPackage() {
                return true;
            }

            @Override
            public boolean isEnumTypeAddSuffix() {
                return true;
            }

        };
        SchemaMapper mapper = new SchemaMapper(new RuleFactory(config, new Jackson2Annotator(config), new SchemaStore()), new SchemaGenerator());
        mapper.generate(codeModel, "Table", "com.czg.summer.definition.business", source);

        File outDir = new File(OUTPUT_BASE_DIR);
        if (!outDir.exists()) {
            outDir.mkdirs();
        } else {
            FileUtil.del(OUTPUT_BASE_DIR);
            FileUtil.mkdir(OUTPUT_BASE_DIR);
        }
        codeModel.build(outDir);
        Desktop.getDesktop().open(outDir);
    }
}
